package de.bahn.dbs.diva.security;

import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.spec.EncodedKeySpec;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;

public class ReadPublicPrivateKeys {

	public static void generateKeys(String keyAlgorithm, int numBits) {

		try {

			// Get the public/private key pair
			KeyPairGenerator keyGen = KeyPairGenerator
					.getInstance(keyAlgorithm);
			keyGen.initialize(numBits);
			KeyPair keyPair = keyGen.genKeyPair();
			PrivateKey privateKey = new PrivateKey() {

				@Override
				public String getFormat() {
					// TODO Auto-generated method stub
					return null;
				}

				@Override
				public byte[] getEncoded() {
					// TODO Auto-generated method stub
					return null;
				}

				@Override
				public String getAlgorithm() {
					// TODO Auto-generated method stub
					return null;
				}
			};
			PublicKey publicKey = new PublicKey() {

				@Override
				public String getFormat() {
					// TODO Auto-generated method stub
					return null;
				}

				@Override
				public byte[] getEncoded() {
					// TODO Auto-generated method stub
					return null;
				}

				@Override
				public String getAlgorithm() {
					// TODO Auto-generated method stub
					return null;
				}
			};

			System.out.println("\n" + "Generating key/value pair using "
					+ privateKey.getAlgorithm() + " algorithm");

			// Get the bytes of the public and private keys
			byte[] privateKeyBytes = privateKey.getEncoded();
			byte[] publicKeyBytes = publicKey.getEncoded();

			// Get the formats of the encoded bytes
			String formatPrivate = privateKey.getFormat(); // PKCS#8
			String formatPublic = publicKey.getFormat(); // X.509

			System.out.println("  Private Key Format : " + formatPrivate);
			System.out.println("  Public Key Format  : " + formatPublic);

			// The bytes can be converted back to public and private key objects
			KeyFactory keyFactory = KeyFactory.getInstance(keyAlgorithm);
			EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(
					privateKeyBytes);
			PrivateKey privateKey2 = keyFactory.generatePrivate(privateKeySpec);

			EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(
					publicKeyBytes);
			PublicKey publicKey2 = keyFactory.generatePublic(publicKeySpec);

			// The original and new keys are the same
			System.out.println("  Are both private keys equal? "
					+ privateKey.equals(privateKey2) + "\n"
					+ privateKey.toString() + "\n" + privateKey2.toString());

			System.out.println("  Are both public keys equal? "
					+ publicKey.equals(publicKey2));

		} catch (InvalidKeySpecException specException) {

			System.out.println("Exception");
			System.out.println("Invalid Key Spec Exception");

		} catch (NoSuchAlgorithmException e) {

			System.out.println("Exception");
			System.out.println("No such algorithm: " + keyAlgorithm);

		}

	}

}
